package com.chenye.base;

import java.lang.instrument.Instrumentation;

/**
 * @Auther:chenye
 * @Data:2018/6/26
 * @Description:命令式启动 java -javaagent:pre.jar=xxx -javaagent:pre.jar=xxx ... -jar jarName
 *
 * javaAgent 就相当如jvm层面提供的aop
 *
 * MANIFEST.MF配置如下：
 * Manifest-Version: 1.0
 * Premain-Class: com.chenye.base.JavaAgentTest
 * Can-Redefine-Classes: true
 * 第四行为空行
 */
public class JavaAgentTest {
    /**
     * 该方法在main方法之前运行，与main方法运行在同一个JVM中
     * 并被同一个System ClassLoader装载
     * 被统一的安全策略(security policy)和上下文(context)管理
     *
     * @param agentOps
     * @param inst
     * @create  2016年3月30日
     */
    public static void premain(String agentOps,Instrumentation inst){

        System.out.println("====premain 方法执行");
        System.out.println(agentOps);
        inst.addTransformer(new MyTransformer());
    }

    /**
     * 如果不存在 premain(String agentOps, Instrumentation inst)
     * 则会执行 premain(String agentOps)
     *
     * @param agentOps
     * @create  2016年3月30日
     */
    public static void premain(String agentOps){

        System.out.println("====premain方法执行2====");
        System.out.println(agentOps);
    }
    public static void main(String[] args) {
        System.out.println("main");
    }
}
